#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>

#include "semaforos.h"

#define erro_param 	"productor [-p num_productores -veces num_veces]"

char produceItem(int id_proc) {
	return 'A' + id_proc;
}

void anhadirItem(int id_proc, char item) {
	char mensaje [300];
	time_t t;
	pid_t p;
	p=getpid();
	t=time(NULL);

	sprintf(mensaje, "PRODUCTOR %d (%u): Comeza a engadi-lo item '%c' as %s",
			id_proc, p, item, ctime(&t));
	write(0, mensaje, strlen(mensaje));

	if (engadeACola(item) == -1) {
		sprintf(mensaje, "Buffer cheo. Non se pode engadir.\n");
		write(0, mensaje, strlen(mensaje));
	}

	mostrarBuffer();

	t=time(NULL);
	sprintf(mensaje,
			"PRODUCTOR %d (%u): Remata de engadi-lo item '%c' as %s\n",
			id_proc, p, item, ctime(&t));
	write(0, mensaje, strlen(mensaje));
}

int main(int argc, char *argv[]) {
	int nproductores = 0;
	int veces = 0;

	/** VERIFICACION DE PARAMETROS **/
	switch (argc) {
	case 5:
		if (strcmp(argv[1], "-p") || strcmp(argv[3], "-veces"))
			sair(MAL_PARAM, erro_param);
		nproductores = atoi(argv[2]);
		veces = atoi(argv[4]);
		if (nproductores < 1 || veces < 1)
			sair(MAL_PARAM, erro_param);
		break;
	default:
		sair(MAL_PARAM, erro_param);
	}
	/** FIN DA VERIFICACION DE PARAMETROS **/

	/** CREACION DE PRODUCTORES**/
	int id = -1;
	int id_proc = 0;
	pid_t pid;
	int i;
	for (i = 0; i < nproductores; i++) {
		id++;
		pid = fork();
		if (pid == 0) {
			id_proc = id;
			break;
		}
	}
	/** FIN DA CREACION DE PRODUCTORES **/
	char item;
	if (pid == 0) {srand(getpid());
		while (veces--) {
			item = produceItem(id_proc);
			P(BALEIRO);
			P(MUTEX);
			anhadirItem(id_proc, item);
			V(MUTEX);
			V(CHEO);
			/*Esperar entre 1 y 5 segundos*/
			
			int aleat = 1 + (int) (5.0 * (rand() / (RAND_MAX + 1.0)));
			sleep(aleat);
		}
	} else {
		getchar();
	}
	return (EXIT_SUCCESS);
}

